今天就要開始做與芬蘭合作的實驗了,因為會需要大量的時間處理實驗的數據,所以今天就簡短針對一些小功能進行說明。之前看到一篇Paper,也就是 CHI 的 Expanding The Bounds of Seated Virtual Workspaces 這邊文章,內部有使用到 Unity 的 Animation Curve,所以出於好奇我就去Unity 官方網站學習了解 Animation Curved 的使用方法,並從實作中熟悉。
public AnimationCurve aniCurve1 = new AnimationCurve();
public AnimationCurve aniCurve2 = new AnimationCurve(new Keyframe(0,0), new Keyframe(10, 10));
public GameObject moveObj:
第一個 airCurve1 是沒有設定任何範圍的 AnimationCurve (aniCurve1)。
第二個 airCurve2 是有設定範圍的 AnimationCurve 為 ( time, value),透過Keyframe 來設定起始點。
接著是我們的 Move Obj ,將 剛剛的物件 Ball放入進我們的環境中。
指定等等物件的速度。
float speed = 10f;
float _time;
_time += Time.deltaTime;
float _getValue = aniCurve1.Evaluate(_time);
moveObj.transform.position = new Vector3(_getValue, 0f, _time);
distance = speed * time
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimationCurved : MonoBehaviour
{
public AnimationCurve aniCurve1 = new AnimationCurve();
public AnimationCurve aniCurve2 = new AnimationCurve(new Keyframe(0, 0), new Keyframe(10, 10));
public GameObject moveObj;
float speed = 10f;
float _time;
bool startMove = false;
void Update() {
if(Input.GetKeyDown("l"))
{
startMove = true;
}
if(Input.GetKeyDown("k"))
{
startMove = false;
Vector3 preposition = moveObj.transform.position;
moveObj.transform.position = preposition;
}
if(startMove)
{
ObjMove();
Debug.Log("Move Obj Position: " + moveObj.transform.position);
}
}
void ObjMove()
{
_time += Time.deltaTime;
float getValue = aniCurve1.Evaluate(_time);
moveObj.transform.position = new Vector3(getValue, 0f, _time);
}
}
回到 Unity 中你可以設定 Ani Curve 1 的參數 ,自己去調整你每秒位移 X軸的變量,我們執行後就可以發現在不同時間(s)下,X軸位移的量也會不相同。物體會隨時間擺動 X 方向的位置。
解著點選執行,觀察 Console 顯示該 MoveObj 的位置隨著時間改變。
接下來新增該Component TrailRenderer 在我們的MoveObj物件中。類似之前說明的 LineRenderer,所以說這邊我就先不做太多說明。
對了務必記得要在 Material 新增該 Default Line 。避免掉沒有材質。
那我就不多廢話直接上程式碼。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimationCurved : MonoBehaviour
{
public AnimationCurve aniCurve1 = new AnimationCurve();
public AnimationCurve aniCurve2 = new AnimationCurve(new Keyframe(0, 0), new Keyframe(10, 10));
public TrailRenderer trail;
public GameObject moveObj;
float speed = 10f;
float _time;
bool startMove = false;
void Start()
{
trail = GetComponent<TrailRenderer>();
if(trail == null)
trail = gameObject.AddComponent<TrailRenderer>();
trail.startWidth = 0.2f;
trail.endWidth = 0.2f;
trail.startColor = Color.white;
trail.endColor = Color.white;
}
void Update() {
if(Input.GetKeyDown("l"))
{
startMove = true;
}
if(Input.GetKeyDown("k"))
{
startMove = false;
Vector3 preposition = moveObj.transform.position;
moveObj.transform.position = preposition;
}
if(startMove)
{
ObjMove();
Debug.Log("Move Obj Position: " + moveObj.transform.position);
}
}
void ObjMove()
{
_time += Time.deltaTime;
float getValue = aniCurve1.Evaluate(_time);
moveObj.transform.position = new Vector3(getValue, 0f, _time);
}
}
回到 Unity 改變一下 TrailRenderer 的顏色。 藍加紫最對味。
我們把 AnimationCurve 1 調整如下,若要新增轉折節點點選兩下即可。
執行結果如下,點選鍵盤 L 會看到該物件根據 Animation Curve 的設定隨時間改變X軸的方向。很酷八! 其實也不一定要使用在這種路徑上的變化,改變自身Animation Curve 可以有效的去控制其他想要的非線性結果。